#include <main.h>

int	main(int argc, char *argv[])
{
	/*Déclaration des variables*/
	char 			*path ;
	double 			epsilon ;
	double 			alpha ;
	double 			beta ;
	double			cout_meilleur_chemin ;
	double			cout_chemin ;
	double 			rho ;
	double			*longueur_solution ;/*tableau qui contient la longueur de la solution trouvée par chaque fourmi*/
	double			Q ;
	double			x_min ;
	double			y_min ;
	double			x_max ;
	double			y_max ;
	int 			nb_cycles ;
	int 			nb_fourmis ;
	int 			nb_villes ;/*nombre de villes dans le graphe G*/
	int				i ;
	int				j ;
	int				k ;
	int				l ;
	int				*meilleur_chemin ;/*tableau d'entiers contenant dans l'ordre, les numéros des villes formant la meilleure solution*/
	File			browse ;
	FILE 			*f ;
	t_ARC			*temp ;
	t_FOURMI		*tab_fourmis ;
	t_SOMMET		*graphe ;
	
	/*Initialisation et allocation des variables*/
	path = NULL ;
	epsilon = 0.00001 ;
	alpha = 1 ;
	beta = 2 ;
	cout_meilleur_chemin = DBL_MAX ;
	cout_chemin = 0 ;
	rho = 0.5 ;
	longueur_solution = NULL ;
	Q = 1.0 ;
	x_min = 0 ;
	y_min = 0 ;
	x_max = 0 ;
	y_max = 0 ;
	nb_cycles = 25 ;
	nb_fourmis = 200 ;
	nb_villes = 0 ;/*nombre de villes dans le graphe G*/
	i = 0 ;
	j = 0 ;
	k = 0 ;
	l = 0 ;
	meilleur_chemin = NULL ;
	browse = NULL ;
	f = NULL ;
	temp = NULL ;
	tab_fourmis = NULL ;
	graphe = NULL ;
	srand(time(NULL)) ;
	temp = calloc(1, sizeof(*temp)) ;
	browse = calloc(1, sizeof(*browse)) ;
	
	/*Création de la chaîne de caractère contenant le chemin d'accès au fichier .txt à lire. Cette chaîne est contenue dans "path"*/
	path = file_path(argc, argv) ;
	if (path == NULL)
	{
		return (0) ;
	}
	f = fopen(path, "rt") ;
	if(f == NULL)
	{
		printf("\nUne erreur s'est produite lors de l'ouverture du fichier\n") ;
		return (0) ;
	}
	
	/*Affichage du menu de Sélection*/
	while(i != 1 && i != 2)
	{
		printf("\nDésirez-vous rentrer les paramètres manuellement ?\n\nPar défaut :\nepsilon = 0.00001\nalpha = 1\nbeta = 2\nQ = 1\nrho = 0.5\nnb_fourmis = 200\nnb_cycles = 25\n\n1 - OUI\t\t2 - NON\n") ;
		scanf("%d", &i) ;
		if(i == 1)
		{
			printf("\nVeuillez rentrer la valeur de epsilon :\n") ;
			scanf("%lf", &epsilon ) ;
			printf("\nVeuillez rentrer la valeur de alpha :\n") ;
			scanf("%lf", &alpha ) ;
			printf("\nVeuillez rentrer la valeur de beta :\n") ;
			scanf("%lf", &beta ) ;
			printf("\nVeuillez rentrer la valeur de Q :\n") ;
			scanf("%lf", &Q ) ;
			printf("\nVeuillez rentrer une valeur de rho comprise entre 0 et 1 :\n") ;
			scanf("%lf", &rho ) ;
			printf("\nVeuillez rentrer la valeur de nb_fourmis :\n") ;
			scanf("%d", &nb_fourmis) ;
			printf("\nVeuillez rentrer la valeur de nb_cycles :\n") ;
			scanf("%d", &nb_cycles) ;
		}
	}
	
	/*Affichage de l'heure du début de l'exécution de l'algorithme*/
	system("date") ;
	
	/*Création du graphe à partir du fichier texte passé en argument du programme*/
	graphe = creation_graphe(f, graphe, &nb_villes, epsilon, &x_min, &y_min, &x_max, &y_max) ;
	fclose(f) ;
	longueur_solution = calloc(nb_fourmis, sizeof(*longueur_solution)) ;
	meilleur_chemin = calloc(nb_villes, sizeof(*meilleur_chemin)) ;
	tab_fourmis = calloc(nb_fourmis, sizeof(*tab_fourmis)) ;
	
	/*Début de l'algorithme permettant de trouver la meilleur solution*/
	while(j < nb_cycles)
	{
		/*Initialisation du tableau "tab_fourmis" contenant toutes les fourmis*/
		tab_fourmis = init_fourmis(tab_fourmis, nb_fourmis, nb_villes) ;
		k = 0 ;
		while(k < nb_fourmis)
		{
			i = 0 ;
			cout_chemin = 0 ;
			while(i < nb_villes - 1)
			{
				/*Détermination de la prochaine ville à parcourir par la fourmis k se trouvant dans la ville i*/
				choix_ville(graphe[tab_fourmis[k].ville_courante], tab_fourmis + k, nb_villes, alpha, beta, &cout_chemin) ;
				i++ ;
			}
			longueur_solution[k] = cout_chemin ;
			if(cout_chemin < cout_meilleur_chemin)
			{
				cout_meilleur_chemin = cout_chemin ;
				l = 0 ;
				browse = tab_fourmis[k].solution ;
				
				/*Boucle permettant de remplir le tableau d'entiers "meilleur_chemin"*/
				while (browse->next != tab_fourmis[k].solution)
				{
					temp = defiler(&browse) ;
					meilleur_chemin[l] = temp->depart ;
					l++ ;
				}
				temp = defiler(&browse) ;
				meilleur_chemin[nb_villes - 2] = temp->depart ;
				meilleur_chemin[nb_villes - 1] = temp->arrivee ;
			}
			k++ ;
		}
		
		/*Évapore et dépose les phéromones sur chaque arc du graphe*/
		evaporation(graphe, tab_fourmis, longueur_solution, nb_fourmis, nb_villes, Q, rho ) ;
		j++ ;
	}
	l = 1 ;
	
	/*Affichage de l'heure de la fin de l'exécution de l'algorithme*/
	system("date") ;
	
	/*Affichage de la solution dans le terminal*/
	printf("\n\nMeilleur chemin : ")  ;
	printf("%d", meilleur_chemin[0]) ;
	while(l < nb_villes)
	{
		printf(", %d", meilleur_chemin[l])  ;
		l++ ;
	}
	printf("\n\n")  ;
	printf("Cout : %lf\n\n", cout_meilleur_chemin) ;
	
	/*Affichage de la solution dans une fenêtre*/
	affichage_graphique(x_min, y_min, x_max, y_max, meilleur_chemin, nb_villes, graphe) ;
	return(0) ;
}
